<?php
/**
 * Representa a Funcao Geral (Cargo) do usuario na empresa e no sistema
 */
class Funcao implements IObject {

    public $tMysqli;
    private $IDFuncao;
    private $StNome;
    private $tPerfil;
    private $ArUsuario;

    public function __construct($IDFuncao, $StNome, &$tMysqli = null) {
        $this->IDFuncao = $IDFuncao;
        $this->StNome = $StNome;
        $this->tMysqli = $tMysqli;
    }

    /**
     * @static Carrega uma funcao atraves do ID
     *
     * @param   Integer $IDPosition ID da funcao a ser carregada
     * @param   MyDb    $tMysqli    Objeto de conexao com o banco
     *
     * @return  Funcao
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Dezembro de 2011
     */
    public static function loadPosition($IDPosition, $tMysqli) {
        $StMysql = TQuery::getSqlPositionLoad($IDPosition);
        $tMysqli->exec($StMysql);
        return new Funcao($tMysqli->result(0, 'IDFuncao'), $tMysqli->result(0, 'StFuncao'), $tMysqli);
    }

    /**
     * @method  loadProfile
     *
     * Carrega o perfil e suas permissoes do Perfil do Usuario
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Dezembro de 2011
     */
    public function loadProfile() {
        $StSql = TQuery::getSqlPerfilLoad($this->IDUsuario);
        $this->tMysqli->exec($StSql);
        $this->tPerfil = new Perfil($this->tMysqli->result(0, 'IDPerfil'), $this->IDFuncao, $this->tMysqli->result(0, 'StPerfil'), $this->tMysqli);
        $this->tPerfil->loadPermissions();
    }
    /**
     * @method  loadAllProfiles
     *
     * Carrega todos os perfis e suas respectivas funcoes da funcao
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Dezembro de 2011
     */
    public function loadAllProfiles() {
        $StSql = TQuery::getSqlLoadAllProfiles($this->IDFuncao);
        $tQuery = $this->tMysqli->exec($StSql);
        while ($ArPerfil = mysqli_fetch_assoc($tQuery)) {
            $Perfil = new Perfil($ArPerfil['IDPerfil'], $this->IDFuncao, $ArPerfil['StPerfil'], $this->tMysqli);
            $Perfil->loadPermissions();
            $this->tPerfil[] = $Perfil;
        }
    }

    /**
     * @method  countProfiles
     *
     * Conta o numero de Perfies que esta Funcao possui
     *
     * @since   Fevereiro de 2012
     * @return  Integer
     */
    public function countProfiles() {
        return count($this->tPerfil);
    }
    /**
     * @method  loadAllEmployees
     *
     * Carrega todos os usuario que possuem esta funcao
     *
     * @since   Fevereiro de 2012
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     */
    public function loadAllEmployees() {
        $StSql = TQuery::getSqlFindUserByPosition($this->IDFuncao);
        $tQuery = $this->tMysqli->exec($StSql);
        while($ArUsuario = mysqli_fetch_assoc($tQuery)) {
            $this->ArUsuario[] = new Usuario($ArUsuario['IDUsuario'], $this->tMysqli, true);
        }
    }
    /**
     * @method  countEmployees
     *
     * Conta o numero de empregados que o perfil possui
     *
     * @since   Fevereiro de 2012
     * @return  Integer
     */
    public function countEmployees() {
        return count($this->ArUsuario);
    }

    public function countContractorsEmployees() {
        if( empty($this->ArUsuario) ) {
            return 0;
        }
        $contractors = 0;
        foreach( $this->ArUsuario as $Usuario ) {
            if( $Usuario->isContractor() ) {
                $contractors++;
            }
        }
        return $contractors;
    }

    public function hasEmployees() {
        return $this->countEmployees() > 0;
    }

    public function hasProfiles() {
        return $this->countProfiles() > 0;
    }

    public function equals(IObject $Funcao) {
        return ($this->IDFuncao == $Funcao->getIDFuncao());
    }

    public function getIDFuncao() {
        return $this->IDFuncao;
    }

    public function setIDFuncao($IDFuncao) {
        $this->IDFuncao = $IDFuncao;
    }

    public function getStNome() {
        return $this->StNome;
    }

    public function setStNome($StNome) {
        $this->StNome = $StNome;
    }

    public function getTPerfil() {
        return $this->tPerfil;
    }

    public function setTPerfil($tPerfil) {
        $this->tPerfil = $tPerfil;
    }

    public function getArUsuario() {
        return $this->ArUsuario;
    }

    public function setArUsuario($ArUsuario) {
        $this->ArUsuario = $ArUsuario;
    }



}

?>
